# KeyValueRecordMapping.java

    package org.codefilarete.stalactite.engine.configurer.map;

    import java.util.Map;

    import org.codefilarete.reflection.ReadWritePropertyAccessPoint;
    import org.codefilarete.stalactite.mapping.ComposedIdMapping;
    import org.codefilarete.stalactite.mapping.DefaultEntityMapping;
    import org.codefilarete.stalactite.sql.ddl.structure.Column;
    import org.codefilarete.stalactite.sql.ddl.structure.Table;
    import org.codefilarete.tool.VisibleForTesting;

    /**
     * Mapping strategy dedicated to {@link KeyValueRecord}. Very close to {@link org.codefilarete.stalactite.engine.configurer.AssociationRecordMapping}
     * in its principle.
     *
     * @param <K> embedded key bean type
     * @param <V> embedded value bean type
     * @param <I> source identifier type
     * @param <T> relation table type
     * @author Guillaume Mary
     */
    public class KeyValueRecordMapping<K, V, I, T extends Table<T>> extends DefaultEntityMapping<KeyValueRecord<K, V, I>, RecordId<K, I>, T> {

    	@VisibleForTesting
    	public KeyValueRecordMapping(T targetTable,
    	                             Map<? extends ReadWritePropertyAccessPoint<KeyValueRecord<K, V, I>, ?>, Column<T, ?>> propertyToColumn,
    	                             KeyValueRecordIdMapping<K, I, T> idMapping) {
    		super((Class) KeyValueRecord.class,
    				targetTable,
    				propertyToColumn,
    				// cast because idMapping has KeyValueRecord<K, ?, I> as generics instead of KeyValueRecord<K, V, I>
    				(ComposedIdMapping<KeyValueRecord<K, V, I>, RecordId<K, I>>) (ComposedIdMapping) idMapping);
    	}
    }